
/**
*这个作为smartList里的一个条,竖的条条
 * 能被拖动，能被点击，能设置自己的目标位置
 * 
 * 
*/
package kgame5.kgui.kcomp {
import kgame5.kmath.MathDG;
import kgame5.kutil.*;

import flash.display.*;
import flash.events.*;
import flash.geom.*;

public class SmartSliderBarPoorV extends SmartSliderBar{
	//___________________PROPERTY___________________
	
	//--滚动条的事件
	private var sliderAimY:Number=0;
	private var bSliderDrag:Boolean=false;
	
	//___________________METHOD______________________
//	public function SmartSliderBarPoorV(p_mc:MovieClip,EH:Number){
//		super(p_mc);
//		
//		//--
//		mc_bar.height=EH;
//		
//		//--
//		if(mc_sb.stage==null){
//			mc_sb.addEventListener(Event.ADDED_TO_STAGE,atsh,false,0,true);
//		}else{
//			atsh(null);
//		}
//	}
	
	////////////
	public function SmartSliderBarPoorV(p_mc:MovieClip,EH:Number,initPercent:Number=0){
		//trace("SmartSliderBarPoorH",p_mc,EW);
		super(p_mc);
		init(EH);
		
		//-设置最开始的位置
		setPercent(initPercent);
		mc_slider.x=sliderAimY;
		mc_slider.y=0;
	}
	
	private function init(EH:Number){
		//--
		mc_bar.height=EH;
		
		//--
		if(mc_sb.stage==null){//如果是动态生成的，就是还没被加载到舞台
			mc_sb.addEventListener(Event.ADDED_TO_STAGE,atsh,false,0,true);
		}else{//如果本来就在舞台的，则要注册各种事件
			atsh(null);
		}
	}
	//////////
	
	
	
	//--这个是有用的,smartList.clear的时候这个要clear
	override public function clear(){
		mc_slider.y=0;
		sliderAimY=0;
		
		preP=-1;
	
		mc_slider.stopDrag();
	}
	
	//直接设置目标,!!注意这个的原则是杂拖拽过程中，其实是要以拖拽为主的，用户输入优先
	//!!注意设置的是0~1
	//注意除数为0的情况
	override public function setPercent(p:Number){
		//T.p("---------------------slbPoorV.setPercent",p);
		sliderAimY=mc_bar.height*p;
		
		//这个是为了刷新一下
		preP=-1;
	}
	override public function  setPercentImmediately(p:Number){
		sliderAimY=mc_bar.height*p;
		sliderAimY=MathDG.C(sliderAimY,0,mc_bar.height);
		mc_slider.y =sliderAimY;
		
		//这个是为了刷新一下
		preP=-1;
	}
	//返回百分比,0~1
	//这个最终是要返回mapH*p=ey;
	//sliderY/barH=mapH*p/(mapH-EH)
	override public function getPercent():Number{
		var p:Number= mc_slider.y/mc_bar.height;
		return p;
	}
	
	//=====================
	private function atsh(e:Event){
		//T.p("poorv.addtostage");
		//--efh
		mc_sb.addEventListener(Event.ENTER_FRAME,efh,false,0,true);
		
		//--鼠标拖动slider
		Util.OnPress(mc_slider, mdh_slider);//鼠标按住slider
		mc_slider.stage.addEventListener(MouseEvent.MOUSE_UP,muh_slider,false,0,true);//注意在没加入到stage之前这个的stage是空的!!
		
		//--鼠标点bar
		mc_bar.addEventListener(MouseEvent.MOUSE_DOWN,mdh_bar,false,0,true);
		//Util.OnPress(mc_bar, mouseDownHandler_bar);//这个在bar上鼠标放上就可以显示手了
		
		//-----补丁
		if(mc_sb.mc_bar2!=null){//最上面的块，直接滚动到最上面
			Util.OnPress(mc_sb.mc_bar2,OnPressBar2);
			
			mc_sb.mc_bar2.buttonMode=false;
		}
		if(mc_sb.mc_bar3!=null){//最下面的块，直接滚动到最下面
		
			mc_sb.mc_bar3.y=mc_bar.height;
			
			Util.OnPress(mc_sb.mc_bar3,OnPressBar3);
			
			mc_sb.mc_bar3.buttonMode=false;
		}
	}
	
	/////////////////
	//补丁
	private function OnPressBar2(e:MouseEvent){//直接翻到最上面
		setPercent(0);
	}
	private function OnPressBar3(e:MouseEvent){//直接翻到最下面
		setPercent(1);
	}
	/////////////////
	
	private var preP:Number=-1;
	private function efh(e:Event){
		if(bSliderDrag==false){//没有拖动的时候使用缓动
			sliderAimY=MathDG.C(sliderAimY,0,mc_bar.height);
			mc_slider.y = MathDG.Spring (mc_slider.y, sliderAimY, 3);
		}
		
		//--检测是否移动了，如果变了则要通知listern说自己的p变了
		var p:Number=this.getPercent();
		if(preP!=p){
			preP=p;
			var ke:Event=new KEvent(SmartSliderBar.EVENTTYPE_SLIDERMOVE,null);
			this.dispatchEvent(ke);
		}
	}
	
	//-------------滚地图的模块
	private function mdh_slider(e:MouseEvent){
		//T.p("鼠标按下，启动拖拽");
		bSliderDrag=true;
		mc_slider.startDrag(false,new Rectangle(0,0,0,mc_bar.height));
		
		//--
		mc_slider.addEventListener(MouseEvent.MOUSE_MOVE,mmh_slider,false,0,true);
	}
	
	//这个是要检测全局的鼠标抬起，否则如果是在smartList之外鼠标抬起，则不会得到抬起事件
	private function muh_slider(e:MouseEvent){
		if(bSliderDrag==false){//不在拖拽中的就不处理了,因为这个是在对整个舞台的鼠标抬起做的响应
			return;
		}
		//T.p("鼠标抬起，关闭拖拽");
		mc_slider.stopDrag();
		bSliderDrag=false;
		
		//--这个是为了在鼠标抬起的时候mc_slider能在正确的位置 
		sliderAimY=this.mc_slider.y;
		this.mc_slider.y=sliderAimY;
		//--
		mc_slider.removeEventListener(MouseEvent.MOUSE_MOVE,mmh_slider);
	}
	
	//--这个是必要的，为了平滑的拖动
	private function mmh_slider(e:MouseEvent){
		sliderAimY=this.mc_slider.y;
		e.updateAfterEvent();
	}
	
	private function mdh_bar(e:MouseEvent){
		//trace("鼠标点击");
		sliderAimY=e.localY*mc_bar.scaleY;//因为height会变
	}
}//end of class
}